Zavirani childoken v MDI aplikaci
Otázka od: Ing. Igor Vodicka
14. 10. 2004 7:56
Ahoj do kofery!
V MDI aplikaci mam funkci, ktera zavira vsechna otevrena childokna. Pouzivam
nasledujici konstrukci:
for I := MDIChildCount-1 downto 0 do
MDIChildren[I].Close;
Childokno ma nadefinovanou udalost OnClose, kde provadim nasledujici test:
if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno
begin
.
neco;
.
end;
Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v cyklu
zavirana, ale zustava na hodnote puvodniho postu oken.
Nevite nekdo jak zaridit, aby se hodnota MDIChildCount aktualizovala? Delam
v D5 Ent na W2K.
Diky za kazde nakopnuti
Ing. Igor Vodicka
informacni systemy
Nakladatelstvi Sagit
Tel.: 59 6786 001
HTTP://www.sagit.cz/
Odpovedá: Marian Nykel
8. 10. 2004 7:11
A nepomuze tohle:
for I := MDIChildCount-1 downto 1 do
MDIChildren[I].Close;
MN
Ing. Igor Vodicka napsal(a):
> for I := MDIChildCount-1 downto 0 do
> MDIChildren[I].Close;
>
> Childokno ma nadefinovanou udalost OnClose, kde provadim nasledujici test:
>
> if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno
> begin
> .
> neco;
> .
> end;
>
> Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v cyklu
> zavirana, ale zustava na hodnote puvodniho postu oken.
> Nevite nekdo jak zaridit, aby se hodnota MDIChildCount aktualizovala? Delam
> v D5 Ent na W2K.
>
> Diky za kazde nakopnuti
Odpovedá: Jan Sebelik
8. 10. 2004 8:15
> V MDI aplikaci mam funkci, ktera zavira vsechna otevrena
> childokna. Pouzivam
> nasledujici konstrukci:
>
> for I := MDIChildCount-1 downto 0 do
> MDIChildren[I].Close;
>
> Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne
> okna v cyklu
> zavirana, ale zustava na hodnote puvodniho postu oken.
> Nevite nekdo jak zaridit, aby se hodnota MDIChildCount
> aktualizovala? Delam
Problem spociva v tom, ze Close okno fakticky nezavre, ale jenom posle message
WM_CLOSE (resp. neco podobneho).
viz Close - FInd Declaration
Tyto zpravy zustavaji ve fronte zprav a zpracuji se az tehdy, kdyz cyklus
skonci.
Proto by (ac to zni mozna prekvapive) fungovalo i
for I := 0 to MDIChildCount-1 do
MDIChildren[I].Close;
Jednou z moznosti, jak to resit je
for I := MDIChildCount-1 downto 0 do begin
MDIChildren[I].Close;
Application.ProcessMessages;
end;
Ale na to pozor - aplikace uprostred cyklu zpracuje nejen tyto zpravy, ale i
vsechny ostatni.
Mohlo by tak dojit ke spusteni evenhandleru, ktere v danem okamziku nechceme.
Cistsi reseni - to by bylo treba vedet, co se na OnClose posledniho okna deje.
viz nase kurzy Delphi.
Honza
====================================
= RNDr. Jan Sebelik - HAES
= Skolici a konzultacni stredisko pro vyvoj SW
= www.haes.cz
= Vojtiskova 321
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347 735)
====================================
Odpovedá: Pave Gazda
13. 10. 2004 9:07
Ahoj
> for I := MDIChildCount-1 downto 0 do
> MDIChildren[I].Close;
>
> if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno
> begin
> .
> neco;
> .
> end;
>
> Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v
> cyklu
> zavirana, ale zustava na hodnote puvodniho postu oken.
> Nevite nekdo jak zaridit, aby se hodnota MDIChildCount aktualizovala?
> Delam
> v D5 Ent na W2K.
>
jak uz nekdo rikal, zalezi na tom, co to "neco" dela
Pak jsou moznosti:
for I := MDIChildCount-1 downto 1 do
MDIChildren[I].Close;
MDIChildren[0].ClosePosledni;
nebo treba
for I := MDIChildCount-1 downto 1 do
MDIChildren[I].Close;
.. pockej na zavreni (MDIChildCount = 1)
MDIChildren[0].Close;
Pavel
Odpovedá: David Hrbac
14. 10. 2004 8:53
Ahoj,
Po close child okna dej Application.ProcessMessages, bude to fungovat.
David
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Ing. Igor Vodicka
Sent: Thursday, October 14, 2004 8:56 AM
To: delphi-l@clexpert.cz
Subject: Zavirani childoken v MDI aplikaci
Ahoj do kofery!
V MDI aplikaci mam funkci, ktera zavira vsechna otevrena childokna. Pouzivam
nasledujici konstrukci:
for I := MDIChildCount-1 downto 0 do
MDIChildren[I].Close;
Childokno ma nadefinovanou udalost OnClose, kde provadim nasledujici test:
if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno begin
.
neco;
.
end;
Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v cyklu
zavirana, ale zustava na hodnote puvodniho postu oken. Nevite nekdo jak
zaridit, aby se hodnota MDIChildCount aktualizovala? Delam v D5 Ent na W2K.
Diky za kazde nakopnuti
Ing. Igor Vodicka
informacni systemy
Nakladatelstvi Sagit
Tel.: 59 6786 001
HTTP://www.sagit.cz/
Odpovedá: Petr Vones
14. 10. 2004 13:12
From: "David Hrbac" <hrbac.conf@seznam.cz>
> Po close child okna dej Application.ProcessMessages, bude to fungovat.
V zadnem pripade v aplikaci nevolej Application.ProcessMessages
Petr Vones
Odpovedá: David Hrbac
14. 10. 2004 13:15
A to jako proc?
David
-----Original Message-----
> Po close child okna dej Application.ProcessMessages, bude to fungovat.
V zadnem pripade v aplikaci nevolej Application.ProcessMessages
Petr Vones
Odpovedá: Ludek Finstrle
14. 10. 2004 13:20
> V zadnem pripade v aplikaci nevolej Application.ProcessMessages
Nesleduji moc tento thread, ale je to globalni tvrzeni? A pokud ano,
co je duvodem to nedelat? Pripadne co misto toho volat?
Luf
Odpovedá: Petr Vones
14. 10. 2004 14:21
From: "Ludek Finstrle" <ludek.finstrle@pzkagis.cz>
> Nesleduji moc tento thread, ale je to globalni tvrzeni? A pokud ano,
Protoze tak dojde ke zpracovani zprav mimo smycku Application.Run, ktere muze
vyvolat nezadouci kod z mista, kde se zavolalo Application.ProcessMessages.
> Pripadne co misto toho volat?
Nic. Pokud aplikace provadi nejakou delsi akci mela by byt tato v samostatnem
threadu.
Petr Vones